package com.atguigu.cloud.service.impl;

import com.atguigu.cloud.apis.AccountFeignApi;
import com.atguigu.cloud.apis.StorageFeignApi;
import com.atguigu.cloud.entities.Order;
import com.atguigu.cloud.mapper.OrderMapper;
import com.atguigu.cloud.service.OrderService;
import io.seata.core.context.RootContext;
import io.seata.spring.annotation.GlobalTransactional;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import tk.mybatis.mapper.entity.Example;

@Slf4j
@Service
public class OrderServiceImpl implements OrderService {

    @Resource
    private OrderMapper orderMapper;

    @Resource
    private StorageFeignApi storageFeignApi;    // 订单微服务通过openFeign调用库存微服务

    @Resource
    private AccountFeignApi accountFeignApi;    // 订单微服务通过openFeign调用账户微服务

    @Override
    @GlobalTransactional(name = "seata-create-order", rollbackFor = Exception.class)    // 保证数据一致性(AT)
    public void create(Order order) {
//        xid全局事务Id的检查
        String xid = RootContext.getXID();

//        1. 新建订单
        log.info("------------开始新建订单: \t" + "xid: " + xid);
//        订单新建时默认初始订单状态是0
        order.setStatus(0);
        int result = orderMapper.insert(order);
//        插入订单成功后获得插入Mysql的实体对象
        Order orderFromDB = null;
        if (result > 0) {
//            从mysql里面查出刚插入的记录
            orderFromDB = orderMapper.selectOne(order);
            log.info("------------新建订单成功,orderFromDB info: " + orderFromDB);
            System.out.println();

//            2. 扣减库存
            log.info("------------订单微服务开始调用storage库存, 做扣减count");
            storageFeignApi.decrease(orderFromDB.getProductId(), orderFromDB.getCount());
            log.info("------------订单微服务结束调用storage库存, 做扣减成功");
            System.out.println();

//            3. 扣减账户余额
            log.info("------------订单微服务开始调用account库存, 做扣减money");
            accountFeignApi.decrease(orderFromDB.getUserId(), orderFromDB.getMoney());
            log.info("------------订单微服务结束调用account库存, 做扣减成功");
            System.out.println();

//            4. 修改订单状态 将订单状态从0修改为1, 表示已经完成
            log.info("------------修改订单状态");
            orderFromDB.setStatus(1);
            Example example = new Example(Order.class);
            Example.Criteria criteria = example.createCriteria();
            criteria.andEqualTo("userId", orderFromDB.getUserId());
            criteria.andEqualTo("status", 0);
            int updateResult = orderMapper.updateByExampleSelective(orderFromDB, example);
            log.info("------------修改订单状态完成\t" + updateResult);
            log.info("------------orderFromDB info: " + orderFromDB);
        }
        System.out.println();
        log.info("------------结束新建订单: \t" + "xid: " + xid);
    }
}
